package com.enjoyor.soa.traffic.api.ubms.service.dubbo;

import com.enjoyor.soa.traffic.api.ubms.dto.DeptInfoDto;
import com.enjoyor.soa.traffic.util.pojo.Page;
import com.enjoyor.soa.traffic.util.pojo.ResultPojo;

/**
 * 维护部门信息的Dubbo服务
 * @author yuankun
 * @version V1.0
 */
public interface DubboDeptInfoService {
	
	/**
	 * 返回所有部门信息
	 * @return ResultPojo 所有部门信息
	 */
	public ResultPojo getDeptInfo();
	
	/**
	 * 返回部门树信息
	* @Title: getTreeDeptInfo 
	* @Description: TODO(获取指定父节点的部门树) 
	* @param token 令牌
	* @param parentId 父节点部门编码
	* @return
	* @throws
	 */
	public ResultPojo getTreeDeptInfo(String token,String parentId);
	
	/**
	 * 分页返回所有部门信息
	 * @param page 分页对象
	 * @return ResultPojo 包含部门信息的分页对象
	 */
	@SuppressWarnings("rawtypes")
    public ResultPojo getPageDeptInfo(Page page);
	
	/**
	 * 返回指定部门的所有兄弟部门
	 * @param deptId 部门编码
	 * @return ResultPojo 所有兄弟部门信息
	 */
	public ResultPojo getBrotherDeptInfo(String deptId);
	

	/**
	 * 分页返回指定部门的所有兄弟部门
	 * @param deptId 部门编码
	 * @param page 分页对象
	 * @return ResultPojo 包含所有兄弟部门信息的分页对象
	 */
	@SuppressWarnings("rawtypes")
    public ResultPojo getPageBrotherDeptInfo(String deptId, Page page);
	
	/**
	 * 返回指定编码的部门信息
	 * @param deptId 部门编号
	 * @return ResultPojo 部门信息
	 */
	public ResultPojo getDeptInfoById(String deptId);
	
	/**
	 * 按名称匹配并返回部门信息
	 * @param deptName 部门名称
	 * @return ResultPojo 部门信息
	 */
	public ResultPojo getDeptInfoByName(String deptName);
	
	/**
	 * 返回某部门的所有直属子部门信息
	 * @param deptId 部门编码
	 * @return ResultPojo 所有直属子部门信息
	 */
	public ResultPojo getChildDeptInfoById(String deptId);
	
	/**
	 * 按名称匹配并分页返回部门信息
	 * @param deptName 部门名称
	 * @param page	分页对象
	 * @return ResultPojo 包含部门信息的分页对象
	 */
	@SuppressWarnings("rawtypes")
    public ResultPojo getPageDeptInfoByName(String deptName, Page page);

	/**
	 * 返回指定部门的下级部门
	 * @param parentId 上级部门编码
	 * @return ResultPojo 所有下级部门信息
	 */
	public ResultPojo getAllDeptInfoByParentId(String parentId);

	
	/**
	 * 返回指定部门及下辖所有子部门信息
	 * @param parentId 部门编码
	 * @return ResultPojo 指定部门信息+指定部门所有下级部门信息
	 */
	public ResultPojo getDeptInfoByParentId(String parentId);

	/**
	 * 分页返回指定部门及下辖所有子部门信息
	 * @param parentId 部门编码
	 * @param page 分页对象
	 * @return ResultPojo 包含指定部门信息+指定部门所有下级部门信息的分页对象
	 */
	@SuppressWarnings("rawtypes")
	public ResultPojo getPageDeptInfoByParentId(String parentId, Page page);

	/**
	 * 返回指定部门及下辖所有子部门信息
	 * @param parentId 部门父节点
	 * @param deptRank 部门等级
	 * @param deptProper 部门性质
	 * @return ResultPojo 所有符合条件的下级部门信息
	 */
	public ResultPojo getDeptInfoByParentIdOrType(String parentId,String deptRank ,String deptProper);
	

	/**
	 * 添加一条部门信息
	 * @param token 以逗号分隔的输入信息，如用户名等
	 * @param dto 部门信息
	 * @return ResultPojo 添加结果
	 */
	public ResultPojo addDeptInfo(String token, DeptInfoDto dto);
	
	/**
	 * 修改一条部门信息
	 * @param token 以逗号分隔的输入信息，如用户名等
	 * @param dto 部门信息
	 * @return ResultPojo 修改结果
	 */
	public ResultPojo editDeptInfo(String token, DeptInfoDto dto);
	
	/**
	 * 删除指定编码的部门信息
	 * @param token 以逗号分隔的输入信息，如用户名等
	 * @param deptId 部门编码
	 * @return ResultPojo 删除结果
	 */
	public ResultPojo removeDeptInfo(String token, String deptId);
	
	
	/**
	 * 返回指定部门及下辖所有子部门信息
	 * @param parentIds 部门父节点数组
	 * @return ResultPojo 所有符合条件的下级部门信息
	 */
	public ResultPojo getDeptInfoByParentIdArray(String[] parentIds);
	
	/**
	 * 返回最顶级部门信息
	 * 
	 * @return ResultPojo 最顶级部门信息
	 */
	public ResultPojo getRootDeptId();

	/**
	 * 返回所有部门信息
	 *  @param deptId 部门编码
	 *  @param parentId 上级部门编码
	 *  @param deptName 部门名字
	 *  @param parentName 上级部门名字
	 *  @param orderSeq 排序方式
	 * @return ResultPojo 所有部门信息
	 */
	public ResultPojo getDeptInfo(String deptId, String parentId, String deptName, String parentName, String orderSeq);

	/**
	 * 返回所有部门信息
	 *  @param deptId 部门编码
	 *  @param parentId 上级部门编码
	 *  @param deptName 部门名字
	 *  @param parentName 上级部门名字
	 *  @param orderSeq 排序方式
	 *  @param Page 分页信息
	 * @return ResultPojo 所有部门信息
	 */
	@SuppressWarnings("rawtypes")
    public ResultPojo getPageDeptInfo(String deptId, String parentId, String deptName, String parentName, String orderSeq, Page page);

	/**
	 * 获取只有支队和大队的部门信息
	 * @param deptId 最顶级的部门编号
	 * @return ResultPojo 支队和大队的部门信息
	 */
	public ResultPojo getDeptGroup(String deptId);

	/**
	 * 获取部门树
	 * @param deptId 最顶级的部门编号
	 * @param extraParam 额外部门
	 * @return ResultPojo 部门树
	 */
	public ResultPojo getDeptGroupTree(String deptId, String extraParam);
}
